package cn.wonderland.org.service.impl;

import cn.wonderland.basic.service.impl.BaseServiceImpl;
import cn.wonderland.basic.util.PageList;
import cn.wonderland.org.domain.Department;
import cn.wonderland.org.mapper.DepartmentMapper;
import cn.wonderland.org.query.DepartmentQuery;
import cn.wonderland.org.service.DepartmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Transactional()
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements DepartmentService {

    @Autowired
    private DepartmentMapper departmentMapper;

    @Override
    public List<Department> deptTree() {
        // 准备一个空集合装数据
        List<Department> list = new ArrayList<>();
        // 查询出所有信息
        List<Department> all = departmentMapper.findAll();
        // 使用stream流将集合转成Map<Long, Department>；
        // Stream流的collect方法将集合转换为Map。其中Collectors.toMap方法可以将指定的键值对转换为Map中的一条记录，
        // 其第一个参数为指定的键，第二个参数为值，本例中键为Department对象的id，即Department::getId，
        // 值为Department对象本身，即department -> department；最终将转换后的Map赋值给map变量。
        Map<Long, Department> map = all.stream().collect(Collectors.toMap(Department::getId, department -> department));

        for (Department department : all) { // 遍历集合
            // 如果部门对象的父级ID为空，说明该部门为根节点，需要将其添加到集合中
            if (department.getParentId() == null) { // ID为空新增到集合中
                list.add(department);
            } else {
                // 如果部门对象的父级ID不为空，说明该部门为子节点，需要将其添加到其父节点的children集合中。
                // 通过部门对象的getParentId方法获取其父节点的ID，并使用Map.get方法根据ID查找父节点对象。
                Department parent = map.get(department.getParentId());
                if (parent != null) {
                    // 如果父节点对象不为空，说明找到了该部门的父节点，需要将该部门对象添加到父节点的children集合中。
                    parent.getChildren().add(department);
                }
            }
        }
        return list;
    }
}
